🎖️GitЯра🎖️
src/helpers/bridges/RS232Bridge.cpp 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 4.92 KB
Tff7b72#Tff7b72include T8b949e"RS232Bridge.h"
Tff7b72#Tff7b72include T8b949e<HardwareSerial.h>
Tff7b72#Tff7b72ifdef WITH_RS232_BRIDGE
Te6edf3RS232BridgeTff7b72:Tff7b72:Te6edf3RS232BridgeTb4b4b4(Te6edf3NodePrefs Tff7b72*Te6edf3prefsTb4b4b4, Te6edf3Stream Tff7b72&Te6edf3serialTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketManager Tff7b72*Te6edf3mgrTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3RTCClock Tff7b72*Te6edf3rtcTb4b4b4)
Tff7b72: Te6edf3BridgeBaseTb4b4b4(Te6edf3prefsTb4b4b4, Te6edf3mgrTb4b4b4, Te6edf3rtcTb4b4b4)Tb4b4b4, Te6edf3_serialTb4b4b4(Tff7b72&Te6edf3serialTb4b4b4) Tb4b4b4{Tb4b4b4}
Tffa657void Te6edf3RS232BridgeTff7b72:Tff7b72:Te6edf3beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffInitializing at %d baud...Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3_prefsTff7b72-Tff7b72>Te6edf3bridge_baudTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if !defined(WITH_RS232_BRIDGE_RX) || !defined(WITH_RS232_BRIDGE_TX)
Tff7b72#Tff7b72error "WITH_RS232_BRIDGE_RX and WITH_RS232_BRIDGE_TX must be defined"
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if defined(ESP32)
Tb4b4b4(Tb4b4b4(Te6edf3HardwareSerial Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3setPinsTb4b4b4(Te6edf3WITH_RS232_BRIDGE_RXTb4b4b4, Te6edf3WITH_RS232_BRIDGE_TXTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif defined(NRF52_PLATFORM)
T8b949e// Tested with RAK_4631 and T114
Tb4b4b4(Tb4b4b4(Te6edf3Uart Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3setPinsTb4b4b4(Te6edf3WITH_RS232_BRIDGE_RXTb4b4b4, Te6edf3WITH_RS232_BRIDGE_TXTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif defined(RP2040_PLATFORM)
Tb4b4b4(Tb4b4b4(Te6edf3SerialUART Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3setRXTb4b4b4(Te6edf3WITH_RS232_BRIDGE_RXTb4b4b4)Tb4b4b4;
Tb4b4b4(Tb4b4b4(Te6edf3SerialUART Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3setTXTb4b4b4(Te6edf3WITH_RS232_BRIDGE_TXTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif defined(STM32_PLATFORM)
Tb4b4b4(Tb4b4b4(Te6edf3HardwareSerial Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3setRxTb4b4b4(Te6edf3WITH_RS232_BRIDGE_RXTb4b4b4)Tb4b4b4;
Tb4b4b4(Tb4b4b4(Te6edf3HardwareSerial Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3setTxTb4b4b4(Te6edf3WITH_RS232_BRIDGE_TXTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72#Tff7b72error RS232Bridge was not tested on the current platform
Tff7b72#Tff7b72endif
Tb4b4b4(Tb4b4b4(Te6edf3HardwareSerial Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3beginTb4b4b4(Te6edf3_prefsTff7b72-Tff7b72>Te6edf3bridge_baudTb4b4b4)Tb4b4b4;
T8b949e// Update bridge state
Te6edf3_initialized Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3RS232BridgeTff7b72:Tff7b72:Te6edf3endTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffStopping...Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4(Tb4b4b4(Te6edf3HardwareSerial Tff7b72*Tb4b4b4)Te6edf3_serialTb4b4b4)Tff7b72-Tff7b72>Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Update bridge state
Te6edf3_initialized Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3RS232BridgeTff7b72:Tff7b72:Te6edf3loopTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Guard against uninitialized state
Tff7b72if Tb4b4b4(Te6edf3_initialized Tff7b72=Tff7b72= Tffa657falseTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72while Tb4b4b4(Te6edf3_serialTff7b72-Tff7b72>Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3b Tff7b72= Te6edf3_serialTff7b72-Tff7b72>Te6edf3readTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_rx_buffer_pos Tff7b72< T79c0ff2Tb4b4b4) Tb4b4b4{
T8b949e// Waiting for magic word
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3_rx_buffer_pos Tff7b72=Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Te6edf3b Tff7b72=Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3BRIDGE_PACKET_MAGIC Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4)Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3_rx_buffer_pos Tff7b72=Tff7b72= T79c0ff1 Tff7b72&Tff7b72& Te6edf3b Tff7b72=Tff7b72= Tb4b4b4(Te6edf3BRIDGE_PACKET_MAGIC Tff7b72& T79c0ff0xFFTb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_rx_bufferTb4b4b4[Te6edf3_rx_buffer_posTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3bTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Invalid magic byte, reset and start over
Te6edf3_rx_buffer_pos Tff7b72= T79c0ff0Tb4b4b4;
T8b949e// Check if this byte could be the start of a new magic word
Tff7b72if Tb4b4b4(Te6edf3b Tff7b72=Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3BRIDGE_PACKET_MAGIC Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_rx_bufferTb4b4b4[Te6edf3_rx_buffer_posTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3bTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Reading length, payload, and checksum
Te6edf3_rx_bufferTb4b4b4[Te6edf3_rx_buffer_posTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3bTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_rx_buffer_pos Tff7b72>Tff7b72= T79c0ff4Tb4b4b4) Tb4b4b4{
Tffa657uint16_t Te6edf3len Tff7b72= Tb4b4b4(Te6edf3_rx_bufferTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3_rx_bufferTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
T8b949e// Validate length field
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> Tb4b4b4(Te6edf3MAX_TRANS_UNIT Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX invalid length %d, resettingTffea00\nTa5d6ff"Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3_rx_buffer_pos Tff7b72= T79c0ff0Tb4b4b4; T8b949e// Invalid length, reset
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3_rx_buffer_pos Tff7b72=Tff7b72= Te6edf3len Tff7b72+ Te6edf3SERIAL_OVERHEADTb4b4b4) Tb4b4b4{ T8b949e// Full packet received
Tffa657uint16_t Te6edf3received_checksum Tff7b72= Tb4b4b4(Te6edf3_rx_bufferTb4b4b4[T79c0ff4 Tff7b72+ Te6edf3lenTb4b4b4] Tff7b72<Tff7b72< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3_rx_bufferTb4b4b4[T79c0ff5 Tff7b72+ Te6edf3lenTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3validateChecksumTb4b4b4(Te6edf3_rx_buffer Tff7b72+ T79c0ff4Tb4b4b4, Te6edf3lenTb4b4b4, Te6edf3received_checksumTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX, len=%d crc=0x%04xTffea00\nTa5d6ff"Tb4b4b4, Te6edf3lenTb4b4b4, Te6edf3received_checksumTb4b4b4)Tb4b4b4;
Te6edf3meshTff7b72:Tff7b72:Te6edf3Packet Tff7b72*Te6edf3pkt Tff7b72= Te6edf3_mgrTff7b72-Tff7b72>Te6edf3allocNewTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pktTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3pktTff7b72-Tff7b72>Te6edf3readFromTb4b4b4(Te6edf3_rx_buffer Tff7b72+ T79c0ff4Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3onPacketReceivedTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX failed to parse packetTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3_mgrTff7b72-Tff7b72>Te6edf3freeTb4b4b4(Te6edf3pktTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX failed to allocate packetTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRX checksum mismatch, rcv=0x%04xTffea00\nTa5d6ff"Tb4b4b4, Te6edf3received_checksumTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_rx_buffer_pos Tff7b72= T79c0ff0Tb4b4b4; T8b949e// Reset for next packet
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3RS232BridgeTff7b72:Tff7b72:Te6edf3sendPacketTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3Packet Tff7b72*Te6edf3packetTb4b4b4) Tb4b4b4{
T8b949e// Guard against uninitialized state
Tff7b72if Tb4b4b4(Te6edf3_initialized Tff7b72=Tff7b72= Tffa657falseTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// First validate the packet pointer
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3packetTb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffTX invalid packet pointerTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_seen_packetsTb4b4b4.Te6edf3wasSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_seen_packetsTb4b4b4.Te6edf3markSeenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3bufferTb4b4b4[Te6edf3MAX_SERIAL_PACKET_SIZETb4b4b4]Tb4b4b4;
Tffa657uint16_t Te6edf3len Tff7b72= Te6edf3packetTff7b72-Tff7b72>Te6edf3writeToTb4b4b4(Te6edf3buffer Tff7b72+ T79c0ff4Tb4b4b4)Tb4b4b4;
T8b949e// Check if packet fits within our maximum payload size
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> Tb4b4b4(Te6edf3MAX_TRANS_UNIT Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffTX packet too large (payload=%d, max=%d)Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3lenTb4b4b4, Te6edf3MAX_TRANS_UNIT Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// Build packet header
Te6edf3bufferTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3BRIDGE_PACKET_MAGIC Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// Magic high byte
Te6edf3bufferTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3BRIDGE_PACKET_MAGIC Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// Magic low byte
Te6edf3bufferTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3len Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// Length high byte
Te6edf3bufferTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Te6edf3len Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// Length low byte
T8b949e// Calculate checksum over the payload
Tffa657uint16_t Te6edf3checksum Tff7b72= Te6edf3fletcher16Tb4b4b4(Te6edf3buffer Tff7b72+ T79c0ff4Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3bufferTb4b4b4[T79c0ff4 Tff7b72+ Te6edf3lenTb4b4b4] Tff7b72= Tb4b4b4(Te6edf3checksum Tff7b72>Tff7b72> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// Checksum high byte
Te6edf3bufferTb4b4b4[T79c0ff5 Tff7b72+ Te6edf3lenTb4b4b4] Tff7b72= Te6edf3checksum Tff7b72& T79c0ff0xFFTb4b4b4; T8b949e// Checksum low byte
T8b949e// Send complete packet
Te6edf3_serialTff7b72-Tff7b72>Te6edf3writeTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3len Tff7b72+ Te6edf3SERIAL_OVERHEADTb4b4b4)Tb4b4b4;
Te6edf3BRIDGE_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffTX, len=%d crc=0x%04xTffea00\nTa5d6ff"Tb4b4b4, Te6edf3lenTb4b4b4, Te6edf3checksumTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3RS232BridgeTff7b72:Tff7b72:Te6edf3onPacketReceivedTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3Packet Tff7b72*Te6edf3packetTb4b4b4) Tb4b4b4{
Te6edf3handleReceivedPacketTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Served by rngit 1.5.2 - Generated in 0.15s